home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / docs / doc2rnh.c < prev    next >
C/C++ Source or Header  |  1998-11-20  |  9KB  |  370 lines

  1. #ifndef lint
  2. static char *RCSid = "$Id: doc2rno.c,v 0.01 1997/03/09 21:00:00 lph Exp $";
  3. #endif
  4.  
  5. /* GNUPLOT - doc2rnh.c */
  6.  
  7. /*[
  8.  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the complete modified source code.  Modifications are to
  18.  * be distributed as patches to the released version.  Permission to
  19.  * distribute binaries produced by compiling modified sources is granted,
  20.  * provided you
  21.  *   1. distribute the corresponding source modifications from the
  22.  *    released version in the form of a patch file along with the binaries,
  23.  *   2. add special version identification to distinguish your version
  24.  *    in addition to the base release version number,
  25.  *   3. provide your name and address as the primary contact for the
  26.  *    support of your modified version, and
  27.  *   4. retain our contact information in regard to use of the base
  28.  *    software.
  29.  * Permission to distribute the released version of the source code along
  30.  * with corresponding source modifications in the form of a patch file is
  31.  * granted with same provisions 2 through 4 for binary distributions.
  32.  *
  33.  * This software is provided "as is" without express or implied warranty
  34.  * to the extent permitted by applicable law.
  35. ]*/
  36.  
  37. /*
  38.  * doc2rnh.c  -- program to convert Gnuplot .DOC format to 
  39.  *               Digital Standard Runoff for VMS HELP files
  40.  *               (gnuplot.doc, including the terminal documentation
  41.  *                is no longer formated for VMS HELP by default)
  42.  * 
  43.  * From hlp2ms by Thomas Williams 
  44.  *
  45.  * Modified by Russell Lang, 2nd October 1989
  46.  * to make vms help level 1 and 2 create the same ms section level.
  47.  *
  48.  * Modified to become doc2ms by David Kotz (David.Kotz@Dartmouth.edu) 12/89
  49.  * Added table and backquote support.
  50.  *
  51.  * Adapted from doc2ms.c (the unix 'runoff' text-processor)
  52.  * by Lucas Hart 3/97
  53.  *
  54.  * right margin is adjusted two spaces for each level to compensate 
  55.  * for the indentation by VMS HELP
  56.  *
  57.  * the page width can be adjusted by changing the value of DSR_RM 
  58.  * usage: $ MCR []doc2rnh gnuplot.doc gnuplot.rnh
  59.  *        $ RUNOFF gnuplot.rnh
  60.  *
  61.  * 
  62.  */
  63.  
  64. #ifdef HAVE_CONFIG_H
  65. # include "config.h"
  66. #endif
  67.  
  68. #include "ansichek.h"
  69. #include "stdfn.h"
  70. #include "doc2x.h"
  71.  
  72. extern boolean single_top_level;
  73.  
  74. #define LINE_SKIP        3
  75. #define DSR_RM        70
  76.  
  77. void init __PROTO((FILE *));
  78. void convert __PROTO((FILE *, FILE *));
  79. void process_line __PROTO((char *, FILE *));
  80. void section __PROTO((char *, FILE *));
  81. void putrnh __PROTO((char *, FILE *));
  82. void putrnh_ __PROTO((char *, FILE *));
  83. void finish __PROTO((FILE *));
  84.  
  85. static boolean intable = FALSE;
  86. static boolean rnh_table = FALSE;
  87. static boolean initial_entry = FALSE;
  88.  
  89. int main(argc, argv)
  90. int argc;
  91. char **argv;
  92. {
  93.     FILE *infile;
  94.     FILE *outfile;
  95.     infile = stdin;
  96.     outfile = stdout;
  97.  
  98.     single_top_level = TRUE;
  99.  
  100.     if (argc > 3) {
  101.     fprintf(stderr, "Usage: %s [infile [outfile]]\n", argv[0]);
  102.     exit(EXIT_FAILURE);
  103.     }
  104.     if (argc >= 2) {
  105.     if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
  106.         fprintf(stderr, "%s: Can't open %s for reading\n",
  107.             argv[0], argv[1]);
  108.         exit(EXIT_SUCCESS);
  109.     }
  110.     }
  111.     if (argc == 3) {
  112.     if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
  113.         fprintf(stderr, "%s: Can't open %s for writing\n",
  114.             argv[0], argv[2]);
  115.         exit(EXIT_FAILURE);
  116.     }
  117.     }
  118.     init(outfile);
  119.     convert(infile, outfile);
  120.     finish(outfile);
  121.     exit(EXIT_SUCCESS);
  122. }
  123.  
  124.  
  125. void init(b)
  126. FILE *b;
  127. {
  128.     /*     */
  129.     (void) fputs(".no paging\n\
  130. .no flags all\n\
  131. .left margin 1\n\
  132. .right margin 70\n\
  133. .no justify\n", b);
  134. }
  135.  
  136.  
  137. void convert(a, b)
  138. FILE *a, *b;
  139. {
  140.     static char line[MAX_LINE_LEN+1];
  141.  
  142.     while (get_line(line, sizeof(line), a)) {
  143.     process_line(line, b);
  144.     }
  145. }
  146.  
  147. void process_line(line, b)
  148. char *line;
  149. FILE *b;
  150. {
  151.     switch (line[0]) {        /* control character */
  152.     case '?':{            /* interactive help entry */
  153.         break;        /* ignore */
  154.     }
  155.     case '@':{            /* start/end table */
  156.         if (rnh_table) {
  157.         (void) fputs(".end literal\n", b);
  158.         rnh_table = FALSE;
  159.         intable = FALSE;
  160.         } else {
  161. /*                       (void) fputs(".literal\n",b);  */
  162.         intable = TRUE;
  163.         rnh_table = FALSE;
  164.         initial_entry = TRUE;
  165.         }
  166.         /* ignore rest of line */
  167.         break;
  168.     }
  169.     case '^':{            /* html table entry */
  170.         break;        /* ignore */
  171.     }
  172.     case '#':{            /* latex table entry */
  173.         break;        /* ignore */
  174.     }
  175.     case '%':{            /* troff table entry */
  176.         break;        /* ignore */
  177.     }
  178. #if 0
  179. /* 'C' is taken care of by termdoc.c */
  180.     case 'C':{            /*  new Comment designator */
  181.         break;        /* ignore */
  182.     }
  183. #endif
  184.     case '\n':            /* empty text line */
  185.     case ' ':{            /* normal text line */
  186.  
  187. /* most tables are simple; no flags means no protected characters
  188.  * other than period (command indicator) in first column
  189.  *
  190.  * However, for ease of maintainence, two tables have sublevels
  191.  * and descriptions, corresponding to the printed table entries, 
  192.  * encapsulated by the table markers.  Therefore we need to
  193.  * do some more work.
  194.  *
  195.  * Doc2hlp just ignores the table headings and treats
  196.  * lower levels irrespectively, but we need to break
  197.  * the level designators out of the table format.   
  198.  *
  199.  *  The first entry in a table will have either 
  200.  *     - a level number in the first column => remainder of text in
  201.  *                                             table is help text 
  202.  *     - spaces in the first two columns => rest of text is literal 
  203.  *                                          to be placed in table format
  204.  *
  205.  */
  206.  
  207. /* use the "cleartext" table or other text in tables */
  208.  
  209. /*                if (intable)  { /* its already literal */
  210.         if (rnh_table) {    /* its a literal */
  211.         putrnh(line + 1, b);
  212.         break;
  213.         }
  214.         switch (line[1]) {
  215.         case ' ':{
  216.             if ((intable) && (initial_entry)) {
  217.             rnh_table = TRUE;
  218.             initial_entry = FALSE;
  219.             fputs(".literal\n", b);
  220.             putrnh(line + 1, b);
  221.             break;
  222.             }
  223.             /* verbatim mode */
  224.             fputs(".literal\n", b);
  225.             putrnh(line + 1, b);
  226.             fputs(".end literal\n", b);
  227.             break;
  228.         }
  229.  
  230. /*
  231.  *  "." in first column is the DSR command character;
  232.  *  therefore, include the preceeding " "
  233.  */
  234.         case '.':{
  235.             putrnh(line, b);
  236.             break;
  237.         }
  238.         default:{
  239.             if (line[0] == '\n')
  240.             fputs(".skip\n", b);    /* totally blank line */
  241.             else
  242.             putrnh(line + 1, b);
  243.             break;
  244.         }
  245.         break;
  246.         }
  247.         break;
  248.     }
  249.     default:{
  250.         if (isdigit((int) line[0])) {    /* start of section */
  251.  
  252. /* some HELP text is surrounded by table flags */
  253. /* doc2rnh will ignore the flags */
  254.  
  255.         if (intable) {
  256.             if (initial_entry) {
  257.             initial_entry = FALSE;
  258.             rnh_table = FALSE;
  259.             }
  260.         }
  261.         section(line, b);
  262.         } else
  263.         fprintf(stderr, "unknown control code '%c' in column 1\n",
  264.             line[0]);
  265.         break;
  266.     }
  267.     }
  268. }
  269.  
  270.  
  271. /* process a line with a digit control char */
  272. /* starts a new [sub]section */
  273. /* We want to retain section number, so its simpler than w/ TeX or roff */
  274.  
  275. void section(line, b)
  276. char *line;
  277. FILE *b;
  278. {
  279.     int sh_i;
  280.     static int old = 1;
  281. /*  
  282.    (void) sscanf(line,"%d",&sh_i);
  283.    *
  284.    * check to make sure this works with terminals also
  285.  */
  286.     sh_i = atoi(line);
  287.  
  288.     if (sh_i > old) {
  289.     do
  290.         if (old != 1)    /* this line added by rjl */
  291.         (void) fputs(".rm-2\n", b);
  292.     while (++old < sh_i);
  293.     } else if (sh_i < old) {
  294.     do
  295.         if (sh_i != 1)    /* this line added by rjl */
  296.         (void) fputs(".rm+2\n", b);
  297.     while (--old > sh_i);
  298.     }
  299.     /* added by dfk to capitalize section headers */
  300.     /* Header name starts at [2] */
  301. /* omit for online documentation 
  302.  *    if (islower(line[2]))
  303.  *       line[2] = toupper(line[2]);
  304.  */
  305.     old = sh_i;
  306.  
  307.     (void) fputs(".indent -1;\n", b);
  308.     (void) putrnh_(line, b);
  309.     (void) fputs(".br;\n", b);
  310. }
  311.  
  312. /*
  313.  * dummy function in case we need to convert some characters in
  314.  * output string ala doc2tex and doc2ms 
  315.  */
  316.  
  317. void putrnh(s, file)
  318. char *s;
  319. FILE *file;
  320. {
  321.     (void) fputs(s, file);
  322. }
  323.  
  324. /* 
  325.  * LBR$OUTPUT_HELP treats spaces and "/"s as list separators for topics,
  326.  * but they are used in gnuplot.doc for the printed docs; convert to
  327.  * "_" and "|"   Modeled after section heading conversions in doc2tex 
  328.  * and doc2ms. 
  329.  *
  330.  */
  331.  
  332. void putrnh_(s, file)
  333. char *s;
  334. FILE *file;
  335. {
  336.     int i, s_len, last_chr;
  337.  
  338.     s_len = strlen(s);
  339.  
  340.     for (i = s_len - 1; i > 2; i--) {    /* any trailing spaces to drop? */
  341.     if (s[i] != ' ') {
  342.         last_chr = i;
  343.         break;
  344.     }
  345.     }
  346.  
  347.     for (i = 0; i <= last_chr; i++) {
  348.     if (i > 2) {
  349.         switch (s[i]) {
  350.         case ' ':
  351.         (void) fputc('_', file);
  352.         break;
  353.         case '/':
  354.         (void) fputc('|', file);
  355.         break;
  356.         default:
  357.         (void) fputc(s[i], file);
  358.         }
  359.     } else {
  360.         (void) fputc(s[i], file);
  361.     }
  362.     }
  363. }
  364.  
  365. void finish(b)            /* not used */
  366. FILE *b;
  367. {
  368.     return;
  369. }
  370.